<?php
namespace databaseClass;


interface crudData
{
  public function insert(Type $var = null);

  // public function delete(Type $var = null);

  // public function update(Type $var = null);

  // public function select(Type $var = null);

}

class database 
// implements crudData
{
  protected $primary ;
  protected $mysqli;
  var $sql;
  protected $tablename;
  // protected $collectInfo = [];
  var $result;
  const createdb = 'CREATE DATABASE ';
  const insert = 'INSERT INTO ';
  const update = 'UPDATE ';
  const delete = 'DELETE';
  // const createTable = 'CREATE TABLE ';

  /**
   * 构造函数
   *
   * @param string $servername 服务器名字
   * @param string $username   用户名
   * @param string $password   密码
   * @param string $dbName     数据库名字 
   * @param string $port       端口
   * @param string $socket     通信方式
   */
  public function __construct($servername, $username, $password, $dbName='', $port = '', $socket = "")
  {
    if ($port === "") {
      $port = ini_get('mysqli.default_port');
    }
    if ($socket === "") {
      $socket = ini_get('mysqli.default_socket');
    }

    $this->mysqli = new \mysqli($servername, $username, $password, $dbName, $port, $socket);

    if ($this->mysqli->connect_error) {
      die("连接失败: " . $this->mysqli->connect_error);
    }
  }

  /**
   * 改变数据库的连接
   *
   * @param string $servername 服务器名字
   * @param string $username   用户名
   * @param string $password   密码
   * @param string $dbName     数据库名字 
   * @param string $port       端口
   * @param string $socket     通信方式
   */
  // public function changeConnection($servername, $username, $password, $dbName='', $port = '', $socket = "")
  // {
  //   if ($port === "") {
  //     $port = ini_get('mysqli.default_port');
  //   }
  //   if ($socket === "") {
  //     $socket = ini_get('mysqli.default_socket');
  //   }

  //   $this->mysqli = new \mysqli($servername, $username, $password, $dbName, $port, $socket);

  //   if ($this->mysqli->connect_error) {
  //     die("连接失败: " . $this->mysqli->connect_error);
  //   }
  // }

  /**
   * 创建数据库
   *
   * @param string $dbName 数据库名
   */
  public function createdb($dbName)
  {
    $this->sql = static::createdb .$dbName;
    $this->query();
    if($this->result === true){
      echo($dbName . "Create success");
    }else{
      echo("fail to create $dbName " . $conn->error);
    }
  }


  // /**
  //  * 创建表
  //  *
  //  * @param string $tablename 表的名字
  //  * @param array $tableHead 表头
  //  */
  // public function createTable( string $tableName,array $tableHead)
  // {
  //   $tableHead = implode(",",$tableHead);
  //   $this->sql = static::createTable . $tableName . "($tableHead)";
  //   if ($this->mysqli->query($this->sql) === true) {

  //     echo ("Table $tableName created successfully");
  //   } else {
  //     echo ("fail to creat Table $tableName" . PHP_EOL . $this->mysqli->error);
  //   }
  // }

  /**
   * 析构函数，关闭数据库连接
   */
  function __destruct()
  {
    $this->mysqli->close();
  }

  /**
   * 改变表
   */
  public function changetb($tablename)
  {
      $this->tablename = $tablename;
  }
  
  //构造函数,连接数据库 私有 单例模式 final


  // 调用构造函数 static 单例模式


  //析构函数 关闭数据库连接


  // 插入数据
  public function insertdata(array $headdata){
    $head = array_keys($headdata);
    $data = array_values($headdata);
    $this->sql = static::insert . $this->tablename . " (" . implode(",",$head) . ") VALUES ('" . implode("','",$data) ."')";
    echo($this->sql);
    $this->query();
  }
  // 查询数据 

  // 多表查询数据 
  public function moresearch()
  {
      
  }

  // 更新数据
  public function updatedata(array $keyandchange)
  {
    $primarykey = key($keyandchange);
    $primaryvalue = array_shift($keyandchange);
    $set = 'SET ';
    foreach ($keyandchange as $key => $value) {
      if(is_string($value)){
        $set .= "$key = '$value' ,";
      }else{
        $set .= "$key = $value,";
      }
    }
    $set = rtrim($set,',');
    $this->sql = static::update . $this->tablename .$set ."WHERE $primarykey = $primaryvalue";
    // $this->sql = "UPDATE  SET age = 11 ,phone = '13532265985' WHERE id = 312";
    echo($this->sql);
    $this->query();
  }
  
  
  
  //删除数据
  public function deletedata()
  {
      
  }
  //发送sql指令
  public function query()
  {
    $this->result = $this->mysqli->query($this->sql);
    // var_dump($this->result);
    if (!$this->result) {
      $this->mysqli->rollback();
    }
  }

  // 事务处理
  public function begincommit()
  {
    $this->mysqli->autocommit(false);
    $this->mysqli->begin_transaction();
  }
  public function commit()
  {
      $this->mysqli->commit();
      $this->mysqli->autocommit(true);
  }


  //获得表的主键
  // public function getkey()
  // {

  //   $this->primary = 
  // }
}


// $test->createdb('myDB2');
// // 表头数据
// $id = 'id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY';
// $firstName = 'firstname VARCHAR(30) NOT NULL';
// $lastName = 'lastname VARCHAR(30) NOT NULL';
// $email = 'email VARCHAR(50)';
// $regdate = 'reg_date TIMESTAMP';
// $tableHead = array();
// array_push($tableHead, $id, $firstName, $lastName, $email, $regdate);
// $tableName = 'myGuest';
// $test->createTable($tableName,$tableHead);





/** 
 * 将连接的信息放入数组，更改构造函数，去掉改变连接函数，加多一个设置连接信息的函数和进行连接的函数。构造函数就引用
 * 这个两个函数来完成。然后创建表格的函数也要改改，要加上连接选定数据库的函数，不然没法添加表
 * 
 * 增删改查的接口还没有完成。
 * 考虑是否将判定是否成功的if，else独立出来。
 * 切换用户
 * 切换数据库
 * 切换服务器
 * 切换端口
 * 切换socket
 * 多表查询
 * */
